/* sha_long.i
 *
 * Copyright (C) 2006-2016 wolfSSL Inc.
 *
 * This file is part of wolfSSL.
 *
 * wolfSSL is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * wolfSSL is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
 */


/* Rotate a 64-bit value left.
 *
 * a  The number to rotate left.
 * r  The number od bits to rotate left.
 * returns the rotated number.
 */
#define ROTL64(a, n)    (((a)<<(n))|((a)>>(64-(n))))

/* The block operation performed on the state.
 *
 * s  The state.
 */
static void BlockSha3(word64 *s)
{
    word64 b[5], t;

    /* Round 0. */
    /* Col Mix */
    b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
    b[1] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
    b[2] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
    b[3] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
    b[4] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[6], 44);
    b[2] = ROTL64(s[12], 43);
    b[3] = ROTL64(s[18], 21);
    b[4] = ROTL64(s[24], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[6] =  t12 ^ (b[2] | b[3]);
        s[12] = b[2] ^ (b[4] &  t34);
        s[18] =  t34 ^ (b[4] | b[0]);
        s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[3], 28);
    b[1] = ROTL64(s[9], 20);
    b[2] = ROTL64(s[10], 3);
    b[3] = ROTL64(s[16], 45);
    b[4] = ROTL64(s[22], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[3] = b[0] ^ (b[2] &  t12);
        s[9] =  t12 ^ (b[2] | b[3]);
        s[10] = b[2] ^ (b[4] &  t34);
        s[16] =  t34 ^ (b[4] | b[0]);
        s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[1], 1);
    b[1] = ROTL64(s[7], 6);
    b[2] = ROTL64(s[13], 25);
    b[3] = ROTL64(s[19], 8);
    b[4] = ROTL64(s[20], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[1] = b[0] ^ (b[2] &  t12);
        s[7] =  t12 ^ (b[2] | b[3]);
        s[13] = b[2] ^ (b[4] &  t34);
        s[19] =  t34 ^ (b[4] | b[0]);
        s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[4], 27);
    b[1] = ROTL64(s[5], 36);
    b[2] = ROTL64(s[11], 10);
    b[3] = ROTL64(s[17], 15);
    b[4] = ROTL64(s[23], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[4] = b[0] ^ (b[2] &  t12);
        s[5] =  t12 ^ (b[2] | b[3]);
        s[11] = b[2] ^ (b[4] &  t34);
        s[17] =  t34 ^ (b[4] | b[0]);
        s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[2], 62);
    b[1] = ROTL64(s[8], 55);
    b[2] = ROTL64(s[14], 39);
    b[3] = ROTL64(s[15], 41);
    b[4] = ROTL64(s[21], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[2] = b[0] ^ (b[2] &  t12);
        s[8] =  t12 ^ (b[2] | b[3]);
        s[14] = b[2] ^ (b[4] &  t34);
        s[15] =  t34 ^ (b[4] | b[0]);
        s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x1UL;

    /* Round 1. */
    /* Col Mix */
    b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
    b[1] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
    b[2] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
    b[3] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
    b[4] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[9], 44);
    b[2] = ROTL64(s[13], 43);
    b[3] = ROTL64(s[17], 21);
    b[4] = ROTL64(s[21], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[9] =  t12 ^ (b[2] | b[3]);
        s[13] = b[2] ^ (b[4] &  t34);
        s[17] =  t34 ^ (b[4] | b[0]);
        s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[18], 28);
    b[1] = ROTL64(s[22], 20);
    b[2] = ROTL64(s[1], 3);
    b[3] = ROTL64(s[5], 45);
    b[4] = ROTL64(s[14], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[18] = b[0] ^ (b[2] &  t12);
        s[22] =  t12 ^ (b[2] | b[3]);
        s[1] = b[2] ^ (b[4] &  t34);
        s[5] =  t34 ^ (b[4] | b[0]);
        s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[6], 1);
    b[1] = ROTL64(s[10], 6);
    b[2] = ROTL64(s[19], 25);
    b[3] = ROTL64(s[23], 8);
    b[4] = ROTL64(s[2], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[6] = b[0] ^ (b[2] &  t12);
        s[10] =  t12 ^ (b[2] | b[3]);
        s[19] = b[2] ^ (b[4] &  t34);
        s[23] =  t34 ^ (b[4] | b[0]);
        s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[24], 27);
    b[1] = ROTL64(s[3], 36);
    b[2] = ROTL64(s[7], 10);
    b[3] = ROTL64(s[11], 15);
    b[4] = ROTL64(s[15], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[24] = b[0] ^ (b[2] &  t12);
        s[3] =  t12 ^ (b[2] | b[3]);
        s[7] = b[2] ^ (b[4] &  t34);
        s[11] =  t34 ^ (b[4] | b[0]);
        s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[12], 62);
    b[1] = ROTL64(s[16], 55);
    b[2] = ROTL64(s[20], 39);
    b[3] = ROTL64(s[4], 41);
    b[4] = ROTL64(s[8], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[12] = b[0] ^ (b[2] &  t12);
        s[16] =  t12 ^ (b[2] | b[3]);
        s[20] = b[2] ^ (b[4] &  t34);
        s[4] =  t34 ^ (b[4] | b[0]);
        s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8082UL;

    /* Round 2. */
    /* Col Mix */
    b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
    b[1] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
    b[2] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
    b[3] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
    b[4] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[22], 44);
    b[2] = ROTL64(s[19], 43);
    b[3] = ROTL64(s[11], 21);
    b[4] = ROTL64(s[8], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[22] =  t12 ^ (b[2] | b[3]);
        s[19] = b[2] ^ (b[4] &  t34);
        s[11] =  t34 ^ (b[4] | b[0]);
        s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[17], 28);
    b[1] = ROTL64(s[14], 20);
    b[2] = ROTL64(s[6], 3);
    b[3] = ROTL64(s[3], 45);
    b[4] = ROTL64(s[20], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[17] = b[0] ^ (b[2] &  t12);
        s[14] =  t12 ^ (b[2] | b[3]);
        s[6] = b[2] ^ (b[4] &  t34);
        s[3] =  t34 ^ (b[4] | b[0]);
        s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[9], 1);
    b[1] = ROTL64(s[1], 6);
    b[2] = ROTL64(s[23], 25);
    b[3] = ROTL64(s[15], 8);
    b[4] = ROTL64(s[12], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[9] = b[0] ^ (b[2] &  t12);
        s[1] =  t12 ^ (b[2] | b[3]);
        s[23] = b[2] ^ (b[4] &  t34);
        s[15] =  t34 ^ (b[4] | b[0]);
        s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[21], 27);
    b[1] = ROTL64(s[18], 36);
    b[2] = ROTL64(s[10], 10);
    b[3] = ROTL64(s[7], 15);
    b[4] = ROTL64(s[4], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[21] = b[0] ^ (b[2] &  t12);
        s[18] =  t12 ^ (b[2] | b[3]);
        s[10] = b[2] ^ (b[4] &  t34);
        s[7] =  t34 ^ (b[4] | b[0]);
        s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[13], 62);
    b[1] = ROTL64(s[5], 55);
    b[2] = ROTL64(s[2], 39);
    b[3] = ROTL64(s[24], 41);
    b[4] = ROTL64(s[16], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[13] = b[0] ^ (b[2] &  t12);
        s[5] =  t12 ^ (b[2] | b[3]);
        s[2] = b[2] ^ (b[4] &  t34);
        s[24] =  t34 ^ (b[4] | b[0]);
        s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x800000000000808aUL;

    /* Round 3. */
    /* Col Mix */
    b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
    b[1] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
    b[2] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
    b[3] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
    b[4] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[14], 44);
    b[2] = ROTL64(s[23], 43);
    b[3] = ROTL64(s[7], 21);
    b[4] = ROTL64(s[16], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[14] =  t12 ^ (b[2] | b[3]);
        s[23] = b[2] ^ (b[4] &  t34);
        s[7] =  t34 ^ (b[4] | b[0]);
        s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[11], 28);
    b[1] = ROTL64(s[20], 20);
    b[2] = ROTL64(s[9], 3);
    b[3] = ROTL64(s[18], 45);
    b[4] = ROTL64(s[2], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[11] = b[0] ^ (b[2] &  t12);
        s[20] =  t12 ^ (b[2] | b[3]);
        s[9] = b[2] ^ (b[4] &  t34);
        s[18] =  t34 ^ (b[4] | b[0]);
        s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[22], 1);
    b[1] = ROTL64(s[6], 6);
    b[2] = ROTL64(s[15], 25);
    b[3] = ROTL64(s[4], 8);
    b[4] = ROTL64(s[13], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[22] = b[0] ^ (b[2] &  t12);
        s[6] =  t12 ^ (b[2] | b[3]);
        s[15] = b[2] ^ (b[4] &  t34);
        s[4] =  t34 ^ (b[4] | b[0]);
        s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[8], 27);
    b[1] = ROTL64(s[17], 36);
    b[2] = ROTL64(s[1], 10);
    b[3] = ROTL64(s[10], 15);
    b[4] = ROTL64(s[24], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[8] = b[0] ^ (b[2] &  t12);
        s[17] =  t12 ^ (b[2] | b[3]);
        s[1] = b[2] ^ (b[4] &  t34);
        s[10] =  t34 ^ (b[4] | b[0]);
        s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[19], 62);
    b[1] = ROTL64(s[3], 55);
    b[2] = ROTL64(s[12], 39);
    b[3] = ROTL64(s[21], 41);
    b[4] = ROTL64(s[5], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[19] = b[0] ^ (b[2] &  t12);
        s[3] =  t12 ^ (b[2] | b[3]);
        s[12] = b[2] ^ (b[4] &  t34);
        s[21] =  t34 ^ (b[4] | b[0]);
        s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000080008000UL;

    /* Round 4. */
    /* Col Mix */
    b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
    b[1] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
    b[2] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
    b[3] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
    b[4] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[20], 44);
    b[2] = ROTL64(s[15], 43);
    b[3] = ROTL64(s[10], 21);
    b[4] = ROTL64(s[5], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[20] =  t12 ^ (b[2] | b[3]);
        s[15] = b[2] ^ (b[4] &  t34);
        s[10] =  t34 ^ (b[4] | b[0]);
        s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[7], 28);
    b[1] = ROTL64(s[2], 20);
    b[2] = ROTL64(s[22], 3);
    b[3] = ROTL64(s[17], 45);
    b[4] = ROTL64(s[12], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[7] = b[0] ^ (b[2] &  t12);
        s[2] =  t12 ^ (b[2] | b[3]);
        s[22] = b[2] ^ (b[4] &  t34);
        s[17] =  t34 ^ (b[4] | b[0]);
        s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[14], 1);
    b[1] = ROTL64(s[9], 6);
    b[2] = ROTL64(s[4], 25);
    b[3] = ROTL64(s[24], 8);
    b[4] = ROTL64(s[19], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[14] = b[0] ^ (b[2] &  t12);
        s[9] =  t12 ^ (b[2] | b[3]);
        s[4] = b[2] ^ (b[4] &  t34);
        s[24] =  t34 ^ (b[4] | b[0]);
        s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[16], 27);
    b[1] = ROTL64(s[11], 36);
    b[2] = ROTL64(s[6], 10);
    b[3] = ROTL64(s[1], 15);
    b[4] = ROTL64(s[21], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[16] = b[0] ^ (b[2] &  t12);
        s[11] =  t12 ^ (b[2] | b[3]);
        s[6] = b[2] ^ (b[4] &  t34);
        s[1] =  t34 ^ (b[4] | b[0]);
        s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[23], 62);
    b[1] = ROTL64(s[18], 55);
    b[2] = ROTL64(s[13], 39);
    b[3] = ROTL64(s[8], 41);
    b[4] = ROTL64(s[3], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[23] = b[0] ^ (b[2] &  t12);
        s[18] =  t12 ^ (b[2] | b[3]);
        s[13] = b[2] ^ (b[4] &  t34);
        s[8] =  t34 ^ (b[4] | b[0]);
        s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x808bUL;

    /* Round 5. */
    /* Col Mix */
    b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
    b[1] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
    b[2] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
    b[3] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
    b[4] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[2], 44);
    b[2] = ROTL64(s[4], 43);
    b[3] = ROTL64(s[1], 21);
    b[4] = ROTL64(s[3], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[2] =  t12 ^ (b[2] | b[3]);
        s[4] = b[2] ^ (b[4] &  t34);
        s[1] =  t34 ^ (b[4] | b[0]);
        s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[10], 28);
    b[1] = ROTL64(s[12], 20);
    b[2] = ROTL64(s[14], 3);
    b[3] = ROTL64(s[11], 45);
    b[4] = ROTL64(s[13], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[10] = b[0] ^ (b[2] &  t12);
        s[12] =  t12 ^ (b[2] | b[3]);
        s[14] = b[2] ^ (b[4] &  t34);
        s[11] =  t34 ^ (b[4] | b[0]);
        s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[20], 1);
    b[1] = ROTL64(s[22], 6);
    b[2] = ROTL64(s[24], 25);
    b[3] = ROTL64(s[21], 8);
    b[4] = ROTL64(s[23], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[20] = b[0] ^ (b[2] &  t12);
        s[22] =  t12 ^ (b[2] | b[3]);
        s[24] = b[2] ^ (b[4] &  t34);
        s[21] =  t34 ^ (b[4] | b[0]);
        s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[5], 27);
    b[1] = ROTL64(s[7], 36);
    b[2] = ROTL64(s[9], 10);
    b[3] = ROTL64(s[6], 15);
    b[4] = ROTL64(s[8], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[5] = b[0] ^ (b[2] &  t12);
        s[7] =  t12 ^ (b[2] | b[3]);
        s[9] = b[2] ^ (b[4] &  t34);
        s[6] =  t34 ^ (b[4] | b[0]);
        s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[15], 62);
    b[1] = ROTL64(s[17], 55);
    b[2] = ROTL64(s[19], 39);
    b[3] = ROTL64(s[16], 41);
    b[4] = ROTL64(s[18], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[15] = b[0] ^ (b[2] &  t12);
        s[17] =  t12 ^ (b[2] | b[3]);
        s[19] = b[2] ^ (b[4] &  t34);
        s[16] =  t34 ^ (b[4] | b[0]);
        s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x80000001UL;

    /* Round 6. */
    /* Col Mix */
    b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
    b[1] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
    b[2] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
    b[3] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
    b[4] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[12], 44);
    b[2] = ROTL64(s[24], 43);
    b[3] = ROTL64(s[6], 21);
    b[4] = ROTL64(s[18], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[12] =  t12 ^ (b[2] | b[3]);
        s[24] = b[2] ^ (b[4] &  t34);
        s[6] =  t34 ^ (b[4] | b[0]);
        s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[1], 28);
    b[1] = ROTL64(s[13], 20);
    b[2] = ROTL64(s[20], 3);
    b[3] = ROTL64(s[7], 45);
    b[4] = ROTL64(s[19], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[1] = b[0] ^ (b[2] &  t12);
        s[13] =  t12 ^ (b[2] | b[3]);
        s[20] = b[2] ^ (b[4] &  t34);
        s[7] =  t34 ^ (b[4] | b[0]);
        s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[2], 1);
    b[1] = ROTL64(s[14], 6);
    b[2] = ROTL64(s[21], 25);
    b[3] = ROTL64(s[8], 8);
    b[4] = ROTL64(s[15], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[2] = b[0] ^ (b[2] &  t12);
        s[14] =  t12 ^ (b[2] | b[3]);
        s[21] = b[2] ^ (b[4] &  t34);
        s[8] =  t34 ^ (b[4] | b[0]);
        s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[3], 27);
    b[1] = ROTL64(s[10], 36);
    b[2] = ROTL64(s[22], 10);
    b[3] = ROTL64(s[9], 15);
    b[4] = ROTL64(s[16], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[3] = b[0] ^ (b[2] &  t12);
        s[10] =  t12 ^ (b[2] | b[3]);
        s[22] = b[2] ^ (b[4] &  t34);
        s[9] =  t34 ^ (b[4] | b[0]);
        s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[4], 62);
    b[1] = ROTL64(s[11], 55);
    b[2] = ROTL64(s[23], 39);
    b[3] = ROTL64(s[5], 41);
    b[4] = ROTL64(s[17], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[4] = b[0] ^ (b[2] &  t12);
        s[11] =  t12 ^ (b[2] | b[3]);
        s[23] = b[2] ^ (b[4] &  t34);
        s[5] =  t34 ^ (b[4] | b[0]);
        s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000080008081UL;

    /* Round 7. */
    /* Col Mix */
    b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
    b[1] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
    b[2] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
    b[3] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
    b[4] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[13], 44);
    b[2] = ROTL64(s[21], 43);
    b[3] = ROTL64(s[9], 21);
    b[4] = ROTL64(s[17], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[13] =  t12 ^ (b[2] | b[3]);
        s[21] = b[2] ^ (b[4] &  t34);
        s[9] =  t34 ^ (b[4] | b[0]);
        s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[6], 28);
    b[1] = ROTL64(s[19], 20);
    b[2] = ROTL64(s[2], 3);
    b[3] = ROTL64(s[10], 45);
    b[4] = ROTL64(s[23], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[6] = b[0] ^ (b[2] &  t12);
        s[19] =  t12 ^ (b[2] | b[3]);
        s[2] = b[2] ^ (b[4] &  t34);
        s[10] =  t34 ^ (b[4] | b[0]);
        s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[12], 1);
    b[1] = ROTL64(s[20], 6);
    b[2] = ROTL64(s[8], 25);
    b[3] = ROTL64(s[16], 8);
    b[4] = ROTL64(s[4], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[12] = b[0] ^ (b[2] &  t12);
        s[20] =  t12 ^ (b[2] | b[3]);
        s[8] = b[2] ^ (b[4] &  t34);
        s[16] =  t34 ^ (b[4] | b[0]);
        s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[18], 27);
    b[1] = ROTL64(s[1], 36);
    b[2] = ROTL64(s[14], 10);
    b[3] = ROTL64(s[22], 15);
    b[4] = ROTL64(s[5], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[18] = b[0] ^ (b[2] &  t12);
        s[1] =  t12 ^ (b[2] | b[3]);
        s[14] = b[2] ^ (b[4] &  t34);
        s[22] =  t34 ^ (b[4] | b[0]);
        s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[24], 62);
    b[1] = ROTL64(s[7], 55);
    b[2] = ROTL64(s[15], 39);
    b[3] = ROTL64(s[3], 41);
    b[4] = ROTL64(s[11], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[24] = b[0] ^ (b[2] &  t12);
        s[7] =  t12 ^ (b[2] | b[3]);
        s[15] = b[2] ^ (b[4] &  t34);
        s[3] =  t34 ^ (b[4] | b[0]);
        s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000000008009UL;

    /* Round 8. */
    /* Col Mix */
    b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
    b[1] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
    b[2] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
    b[3] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
    b[4] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[19], 44);
    b[2] = ROTL64(s[8], 43);
    b[3] = ROTL64(s[22], 21);
    b[4] = ROTL64(s[11], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[19] =  t12 ^ (b[2] | b[3]);
        s[8] = b[2] ^ (b[4] &  t34);
        s[22] =  t34 ^ (b[4] | b[0]);
        s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[9], 28);
    b[1] = ROTL64(s[23], 20);
    b[2] = ROTL64(s[12], 3);
    b[3] = ROTL64(s[1], 45);
    b[4] = ROTL64(s[15], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[9] = b[0] ^ (b[2] &  t12);
        s[23] =  t12 ^ (b[2] | b[3]);
        s[12] = b[2] ^ (b[4] &  t34);
        s[1] =  t34 ^ (b[4] | b[0]);
        s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[13], 1);
    b[1] = ROTL64(s[2], 6);
    b[2] = ROTL64(s[16], 25);
    b[3] = ROTL64(s[5], 8);
    b[4] = ROTL64(s[24], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[13] = b[0] ^ (b[2] &  t12);
        s[2] =  t12 ^ (b[2] | b[3]);
        s[16] = b[2] ^ (b[4] &  t34);
        s[5] =  t34 ^ (b[4] | b[0]);
        s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[17], 27);
    b[1] = ROTL64(s[6], 36);
    b[2] = ROTL64(s[20], 10);
    b[3] = ROTL64(s[14], 15);
    b[4] = ROTL64(s[3], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[17] = b[0] ^ (b[2] &  t12);
        s[6] =  t12 ^ (b[2] | b[3]);
        s[20] = b[2] ^ (b[4] &  t34);
        s[14] =  t34 ^ (b[4] | b[0]);
        s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[21], 62);
    b[1] = ROTL64(s[10], 55);
    b[2] = ROTL64(s[4], 39);
    b[3] = ROTL64(s[18], 41);
    b[4] = ROTL64(s[7], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[21] = b[0] ^ (b[2] &  t12);
        s[10] =  t12 ^ (b[2] | b[3]);
        s[4] = b[2] ^ (b[4] &  t34);
        s[18] =  t34 ^ (b[4] | b[0]);
        s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8aUL;

    /* Round 9. */
    /* Col Mix */
    b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
    b[1] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
    b[2] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
    b[3] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
    b[4] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[23], 44);
    b[2] = ROTL64(s[16], 43);
    b[3] = ROTL64(s[14], 21);
    b[4] = ROTL64(s[7], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[23] =  t12 ^ (b[2] | b[3]);
        s[16] = b[2] ^ (b[4] &  t34);
        s[14] =  t34 ^ (b[4] | b[0]);
        s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[22], 28);
    b[1] = ROTL64(s[15], 20);
    b[2] = ROTL64(s[13], 3);
    b[3] = ROTL64(s[6], 45);
    b[4] = ROTL64(s[4], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[22] = b[0] ^ (b[2] &  t12);
        s[15] =  t12 ^ (b[2] | b[3]);
        s[13] = b[2] ^ (b[4] &  t34);
        s[6] =  t34 ^ (b[4] | b[0]);
        s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[19], 1);
    b[1] = ROTL64(s[12], 6);
    b[2] = ROTL64(s[5], 25);
    b[3] = ROTL64(s[3], 8);
    b[4] = ROTL64(s[21], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[19] = b[0] ^ (b[2] &  t12);
        s[12] =  t12 ^ (b[2] | b[3]);
        s[5] = b[2] ^ (b[4] &  t34);
        s[3] =  t34 ^ (b[4] | b[0]);
        s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[11], 27);
    b[1] = ROTL64(s[9], 36);
    b[2] = ROTL64(s[2], 10);
    b[3] = ROTL64(s[20], 15);
    b[4] = ROTL64(s[18], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[11] = b[0] ^ (b[2] &  t12);
        s[9] =  t12 ^ (b[2] | b[3]);
        s[2] = b[2] ^ (b[4] &  t34);
        s[20] =  t34 ^ (b[4] | b[0]);
        s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[8], 62);
    b[1] = ROTL64(s[1], 55);
    b[2] = ROTL64(s[24], 39);
    b[3] = ROTL64(s[17], 41);
    b[4] = ROTL64(s[10], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[8] = b[0] ^ (b[2] &  t12);
        s[1] =  t12 ^ (b[2] | b[3]);
        s[24] = b[2] ^ (b[4] &  t34);
        s[17] =  t34 ^ (b[4] | b[0]);
        s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x88UL;

    /* Round 10. */
    /* Col Mix */
    b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
    b[1] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
    b[2] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
    b[3] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
    b[4] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[15], 44);
    b[2] = ROTL64(s[5], 43);
    b[3] = ROTL64(s[20], 21);
    b[4] = ROTL64(s[10], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[15] =  t12 ^ (b[2] | b[3]);
        s[5] = b[2] ^ (b[4] &  t34);
        s[20] =  t34 ^ (b[4] | b[0]);
        s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[14], 28);
    b[1] = ROTL64(s[4], 20);
    b[2] = ROTL64(s[19], 3);
    b[3] = ROTL64(s[9], 45);
    b[4] = ROTL64(s[24], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[14] = b[0] ^ (b[2] &  t12);
        s[4] =  t12 ^ (b[2] | b[3]);
        s[19] = b[2] ^ (b[4] &  t34);
        s[9] =  t34 ^ (b[4] | b[0]);
        s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[23], 1);
    b[1] = ROTL64(s[13], 6);
    b[2] = ROTL64(s[3], 25);
    b[3] = ROTL64(s[18], 8);
    b[4] = ROTL64(s[8], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[23] = b[0] ^ (b[2] &  t12);
        s[13] =  t12 ^ (b[2] | b[3]);
        s[3] = b[2] ^ (b[4] &  t34);
        s[18] =  t34 ^ (b[4] | b[0]);
        s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[7], 27);
    b[1] = ROTL64(s[22], 36);
    b[2] = ROTL64(s[12], 10);
    b[3] = ROTL64(s[2], 15);
    b[4] = ROTL64(s[17], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[7] = b[0] ^ (b[2] &  t12);
        s[22] =  t12 ^ (b[2] | b[3]);
        s[12] = b[2] ^ (b[4] &  t34);
        s[2] =  t34 ^ (b[4] | b[0]);
        s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[16], 62);
    b[1] = ROTL64(s[6], 55);
    b[2] = ROTL64(s[21], 39);
    b[3] = ROTL64(s[11], 41);
    b[4] = ROTL64(s[1], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[16] = b[0] ^ (b[2] &  t12);
        s[6] =  t12 ^ (b[2] | b[3]);
        s[21] = b[2] ^ (b[4] &  t34);
        s[11] =  t34 ^ (b[4] | b[0]);
        s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x80008009UL;

    /* Round 11. */
    /* Col Mix */
    b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
    b[1] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
    b[2] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
    b[3] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
    b[4] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[4], 44);
    b[2] = ROTL64(s[3], 43);
    b[3] = ROTL64(s[2], 21);
    b[4] = ROTL64(s[1], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[4] =  t12 ^ (b[2] | b[3]);
        s[3] = b[2] ^ (b[4] &  t34);
        s[2] =  t34 ^ (b[4] | b[0]);
        s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[20], 28);
    b[1] = ROTL64(s[24], 20);
    b[2] = ROTL64(s[23], 3);
    b[3] = ROTL64(s[22], 45);
    b[4] = ROTL64(s[21], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[20] = b[0] ^ (b[2] &  t12);
        s[24] =  t12 ^ (b[2] | b[3]);
        s[23] = b[2] ^ (b[4] &  t34);
        s[22] =  t34 ^ (b[4] | b[0]);
        s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[15], 1);
    b[1] = ROTL64(s[19], 6);
    b[2] = ROTL64(s[18], 25);
    b[3] = ROTL64(s[17], 8);
    b[4] = ROTL64(s[16], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[15] = b[0] ^ (b[2] &  t12);
        s[19] =  t12 ^ (b[2] | b[3]);
        s[18] = b[2] ^ (b[4] &  t34);
        s[17] =  t34 ^ (b[4] | b[0]);
        s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[10], 27);
    b[1] = ROTL64(s[14], 36);
    b[2] = ROTL64(s[13], 10);
    b[3] = ROTL64(s[12], 15);
    b[4] = ROTL64(s[11], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[10] = b[0] ^ (b[2] &  t12);
        s[14] =  t12 ^ (b[2] | b[3]);
        s[13] = b[2] ^ (b[4] &  t34);
        s[12] =  t34 ^ (b[4] | b[0]);
        s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[5], 62);
    b[1] = ROTL64(s[9], 55);
    b[2] = ROTL64(s[8], 39);
    b[3] = ROTL64(s[7], 41);
    b[4] = ROTL64(s[6], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[5] = b[0] ^ (b[2] &  t12);
        s[9] =  t12 ^ (b[2] | b[3]);
        s[8] = b[2] ^ (b[4] &  t34);
        s[7] =  t34 ^ (b[4] | b[0]);
        s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000aUL;

    /* Round 12. */
    /* Col Mix */
    b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
    b[1] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
    b[2] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
    b[3] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
    b[4] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[24], 44);
    b[2] = ROTL64(s[18], 43);
    b[3] = ROTL64(s[12], 21);
    b[4] = ROTL64(s[6], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[24] =  t12 ^ (b[2] | b[3]);
        s[18] = b[2] ^ (b[4] &  t34);
        s[12] =  t34 ^ (b[4] | b[0]);
        s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[2], 28);
    b[1] = ROTL64(s[21], 20);
    b[2] = ROTL64(s[15], 3);
    b[3] = ROTL64(s[14], 45);
    b[4] = ROTL64(s[8], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[2] = b[0] ^ (b[2] &  t12);
        s[21] =  t12 ^ (b[2] | b[3]);
        s[15] = b[2] ^ (b[4] &  t34);
        s[14] =  t34 ^ (b[4] | b[0]);
        s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[4], 1);
    b[1] = ROTL64(s[23], 6);
    b[2] = ROTL64(s[17], 25);
    b[3] = ROTL64(s[11], 8);
    b[4] = ROTL64(s[5], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[4] = b[0] ^ (b[2] &  t12);
        s[23] =  t12 ^ (b[2] | b[3]);
        s[17] = b[2] ^ (b[4] &  t34);
        s[11] =  t34 ^ (b[4] | b[0]);
        s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[1], 27);
    b[1] = ROTL64(s[20], 36);
    b[2] = ROTL64(s[19], 10);
    b[3] = ROTL64(s[13], 15);
    b[4] = ROTL64(s[7], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[1] = b[0] ^ (b[2] &  t12);
        s[20] =  t12 ^ (b[2] | b[3]);
        s[19] = b[2] ^ (b[4] &  t34);
        s[13] =  t34 ^ (b[4] | b[0]);
        s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[3], 62);
    b[1] = ROTL64(s[22], 55);
    b[2] = ROTL64(s[16], 39);
    b[3] = ROTL64(s[10], 41);
    b[4] = ROTL64(s[9], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[3] = b[0] ^ (b[2] &  t12);
        s[22] =  t12 ^ (b[2] | b[3]);
        s[16] = b[2] ^ (b[4] &  t34);
        s[10] =  t34 ^ (b[4] | b[0]);
        s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000808bUL;

    /* Round 13. */
    /* Col Mix */
    b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
    b[1] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
    b[2] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
    b[3] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
    b[4] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[21], 44);
    b[2] = ROTL64(s[17], 43);
    b[3] = ROTL64(s[13], 21);
    b[4] = ROTL64(s[9], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[21] =  t12 ^ (b[2] | b[3]);
        s[17] = b[2] ^ (b[4] &  t34);
        s[13] =  t34 ^ (b[4] | b[0]);
        s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[12], 28);
    b[1] = ROTL64(s[8], 20);
    b[2] = ROTL64(s[4], 3);
    b[3] = ROTL64(s[20], 45);
    b[4] = ROTL64(s[16], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[12] = b[0] ^ (b[2] &  t12);
        s[8] =  t12 ^ (b[2] | b[3]);
        s[4] = b[2] ^ (b[4] &  t34);
        s[20] =  t34 ^ (b[4] | b[0]);
        s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[24], 1);
    b[1] = ROTL64(s[15], 6);
    b[2] = ROTL64(s[11], 25);
    b[3] = ROTL64(s[7], 8);
    b[4] = ROTL64(s[3], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[24] = b[0] ^ (b[2] &  t12);
        s[15] =  t12 ^ (b[2] | b[3]);
        s[11] = b[2] ^ (b[4] &  t34);
        s[7] =  t34 ^ (b[4] | b[0]);
        s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[6], 27);
    b[1] = ROTL64(s[2], 36);
    b[2] = ROTL64(s[23], 10);
    b[3] = ROTL64(s[19], 15);
    b[4] = ROTL64(s[10], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[6] = b[0] ^ (b[2] &  t12);
        s[2] =  t12 ^ (b[2] | b[3]);
        s[23] = b[2] ^ (b[4] &  t34);
        s[19] =  t34 ^ (b[4] | b[0]);
        s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[18], 62);
    b[1] = ROTL64(s[14], 55);
    b[2] = ROTL64(s[5], 39);
    b[3] = ROTL64(s[1], 41);
    b[4] = ROTL64(s[22], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[18] = b[0] ^ (b[2] &  t12);
        s[14] =  t12 ^ (b[2] | b[3]);
        s[5] = b[2] ^ (b[4] &  t34);
        s[1] =  t34 ^ (b[4] | b[0]);
        s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x800000000000008bUL;

    /* Round 14. */
    /* Col Mix */
    b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
    b[1] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
    b[2] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
    b[3] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
    b[4] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[8], 44);
    b[2] = ROTL64(s[11], 43);
    b[3] = ROTL64(s[19], 21);
    b[4] = ROTL64(s[22], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[8] =  t12 ^ (b[2] | b[3]);
        s[11] = b[2] ^ (b[4] &  t34);
        s[19] =  t34 ^ (b[4] | b[0]);
        s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[13], 28);
    b[1] = ROTL64(s[16], 20);
    b[2] = ROTL64(s[24], 3);
    b[3] = ROTL64(s[2], 45);
    b[4] = ROTL64(s[5], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[13] = b[0] ^ (b[2] &  t12);
        s[16] =  t12 ^ (b[2] | b[3]);
        s[24] = b[2] ^ (b[4] &  t34);
        s[2] =  t34 ^ (b[4] | b[0]);
        s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[21], 1);
    b[1] = ROTL64(s[4], 6);
    b[2] = ROTL64(s[7], 25);
    b[3] = ROTL64(s[10], 8);
    b[4] = ROTL64(s[18], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[21] = b[0] ^ (b[2] &  t12);
        s[4] =  t12 ^ (b[2] | b[3]);
        s[7] = b[2] ^ (b[4] &  t34);
        s[10] =  t34 ^ (b[4] | b[0]);
        s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[9], 27);
    b[1] = ROTL64(s[12], 36);
    b[2] = ROTL64(s[15], 10);
    b[3] = ROTL64(s[23], 15);
    b[4] = ROTL64(s[1], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[9] = b[0] ^ (b[2] &  t12);
        s[12] =  t12 ^ (b[2] | b[3]);
        s[15] = b[2] ^ (b[4] &  t34);
        s[23] =  t34 ^ (b[4] | b[0]);
        s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[17], 62);
    b[1] = ROTL64(s[20], 55);
    b[2] = ROTL64(s[3], 39);
    b[3] = ROTL64(s[6], 41);
    b[4] = ROTL64(s[14], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[17] = b[0] ^ (b[2] &  t12);
        s[20] =  t12 ^ (b[2] | b[3]);
        s[3] = b[2] ^ (b[4] &  t34);
        s[6] =  t34 ^ (b[4] | b[0]);
        s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000000008089UL;

    /* Round 15. */
    /* Col Mix */
    b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
    b[1] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
    b[2] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
    b[3] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
    b[4] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[16], 44);
    b[2] = ROTL64(s[7], 43);
    b[3] = ROTL64(s[23], 21);
    b[4] = ROTL64(s[14], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[16] =  t12 ^ (b[2] | b[3]);
        s[7] = b[2] ^ (b[4] &  t34);
        s[23] =  t34 ^ (b[4] | b[0]);
        s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[19], 28);
    b[1] = ROTL64(s[5], 20);
    b[2] = ROTL64(s[21], 3);
    b[3] = ROTL64(s[12], 45);
    b[4] = ROTL64(s[3], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[19] = b[0] ^ (b[2] &  t12);
        s[5] =  t12 ^ (b[2] | b[3]);
        s[21] = b[2] ^ (b[4] &  t34);
        s[12] =  t34 ^ (b[4] | b[0]);
        s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[8], 1);
    b[1] = ROTL64(s[24], 6);
    b[2] = ROTL64(s[10], 25);
    b[3] = ROTL64(s[1], 8);
    b[4] = ROTL64(s[17], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[8] = b[0] ^ (b[2] &  t12);
        s[24] =  t12 ^ (b[2] | b[3]);
        s[10] = b[2] ^ (b[4] &  t34);
        s[1] =  t34 ^ (b[4] | b[0]);
        s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[22], 27);
    b[1] = ROTL64(s[13], 36);
    b[2] = ROTL64(s[4], 10);
    b[3] = ROTL64(s[15], 15);
    b[4] = ROTL64(s[6], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[22] = b[0] ^ (b[2] &  t12);
        s[13] =  t12 ^ (b[2] | b[3]);
        s[4] = b[2] ^ (b[4] &  t34);
        s[15] =  t34 ^ (b[4] | b[0]);
        s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[11], 62);
    b[1] = ROTL64(s[2], 55);
    b[2] = ROTL64(s[18], 39);
    b[3] = ROTL64(s[9], 41);
    b[4] = ROTL64(s[20], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[11] = b[0] ^ (b[2] &  t12);
        s[2] =  t12 ^ (b[2] | b[3]);
        s[18] = b[2] ^ (b[4] &  t34);
        s[9] =  t34 ^ (b[4] | b[0]);
        s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000000008003UL;

    /* Round 16. */
    /* Col Mix */
    b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
    b[1] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
    b[2] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
    b[3] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
    b[4] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[5], 44);
    b[2] = ROTL64(s[10], 43);
    b[3] = ROTL64(s[15], 21);
    b[4] = ROTL64(s[20], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[5] =  t12 ^ (b[2] | b[3]);
        s[10] = b[2] ^ (b[4] &  t34);
        s[15] =  t34 ^ (b[4] | b[0]);
        s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[23], 28);
    b[1] = ROTL64(s[3], 20);
    b[2] = ROTL64(s[8], 3);
    b[3] = ROTL64(s[13], 45);
    b[4] = ROTL64(s[18], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[23] = b[0] ^ (b[2] &  t12);
        s[3] =  t12 ^ (b[2] | b[3]);
        s[8] = b[2] ^ (b[4] &  t34);
        s[13] =  t34 ^ (b[4] | b[0]);
        s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[16], 1);
    b[1] = ROTL64(s[21], 6);
    b[2] = ROTL64(s[1], 25);
    b[3] = ROTL64(s[6], 8);
    b[4] = ROTL64(s[11], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[16] = b[0] ^ (b[2] &  t12);
        s[21] =  t12 ^ (b[2] | b[3]);
        s[1] = b[2] ^ (b[4] &  t34);
        s[6] =  t34 ^ (b[4] | b[0]);
        s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[14], 27);
    b[1] = ROTL64(s[19], 36);
    b[2] = ROTL64(s[24], 10);
    b[3] = ROTL64(s[4], 15);
    b[4] = ROTL64(s[9], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[14] = b[0] ^ (b[2] &  t12);
        s[19] =  t12 ^ (b[2] | b[3]);
        s[24] = b[2] ^ (b[4] &  t34);
        s[4] =  t34 ^ (b[4] | b[0]);
        s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[7], 62);
    b[1] = ROTL64(s[12], 55);
    b[2] = ROTL64(s[17], 39);
    b[3] = ROTL64(s[22], 41);
    b[4] = ROTL64(s[2], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[7] = b[0] ^ (b[2] &  t12);
        s[12] =  t12 ^ (b[2] | b[3]);
        s[17] = b[2] ^ (b[4] &  t34);
        s[22] =  t34 ^ (b[4] | b[0]);
        s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000000008002UL;

    /* Round 17. */
    /* Col Mix */
    b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
    b[1] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
    b[2] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
    b[3] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
    b[4] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[3], 44);
    b[2] = ROTL64(s[1], 43);
    b[3] = ROTL64(s[4], 21);
    b[4] = ROTL64(s[2], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[3] =  t12 ^ (b[2] | b[3]);
        s[1] = b[2] ^ (b[4] &  t34);
        s[4] =  t34 ^ (b[4] | b[0]);
        s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[15], 28);
    b[1] = ROTL64(s[18], 20);
    b[2] = ROTL64(s[16], 3);
    b[3] = ROTL64(s[19], 45);
    b[4] = ROTL64(s[17], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[15] = b[0] ^ (b[2] &  t12);
        s[18] =  t12 ^ (b[2] | b[3]);
        s[16] = b[2] ^ (b[4] &  t34);
        s[19] =  t34 ^ (b[4] | b[0]);
        s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[5], 1);
    b[1] = ROTL64(s[8], 6);
    b[2] = ROTL64(s[6], 25);
    b[3] = ROTL64(s[9], 8);
    b[4] = ROTL64(s[7], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[5] = b[0] ^ (b[2] &  t12);
        s[8] =  t12 ^ (b[2] | b[3]);
        s[6] = b[2] ^ (b[4] &  t34);
        s[9] =  t34 ^ (b[4] | b[0]);
        s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[20], 27);
    b[1] = ROTL64(s[23], 36);
    b[2] = ROTL64(s[21], 10);
    b[3] = ROTL64(s[24], 15);
    b[4] = ROTL64(s[22], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[20] = b[0] ^ (b[2] &  t12);
        s[23] =  t12 ^ (b[2] | b[3]);
        s[21] = b[2] ^ (b[4] &  t34);
        s[24] =  t34 ^ (b[4] | b[0]);
        s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[10], 62);
    b[1] = ROTL64(s[13], 55);
    b[2] = ROTL64(s[11], 39);
    b[3] = ROTL64(s[14], 41);
    b[4] = ROTL64(s[12], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[10] = b[0] ^ (b[2] &  t12);
        s[13] =  t12 ^ (b[2] | b[3]);
        s[11] = b[2] ^ (b[4] &  t34);
        s[14] =  t34 ^ (b[4] | b[0]);
        s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000000000080UL;

    /* Round 18. */
    /* Col Mix */
    b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
    b[1] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
    b[2] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
    b[3] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
    b[4] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[18], 44);
    b[2] = ROTL64(s[6], 43);
    b[3] = ROTL64(s[24], 21);
    b[4] = ROTL64(s[12], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[18] =  t12 ^ (b[2] | b[3]);
        s[6] = b[2] ^ (b[4] &  t34);
        s[24] =  t34 ^ (b[4] | b[0]);
        s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[4], 28);
    b[1] = ROTL64(s[17], 20);
    b[2] = ROTL64(s[5], 3);
    b[3] = ROTL64(s[23], 45);
    b[4] = ROTL64(s[11], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[4] = b[0] ^ (b[2] &  t12);
        s[17] =  t12 ^ (b[2] | b[3]);
        s[5] = b[2] ^ (b[4] &  t34);
        s[23] =  t34 ^ (b[4] | b[0]);
        s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[3], 1);
    b[1] = ROTL64(s[16], 6);
    b[2] = ROTL64(s[9], 25);
    b[3] = ROTL64(s[22], 8);
    b[4] = ROTL64(s[10], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[3] = b[0] ^ (b[2] &  t12);
        s[16] =  t12 ^ (b[2] | b[3]);
        s[9] = b[2] ^ (b[4] &  t34);
        s[22] =  t34 ^ (b[4] | b[0]);
        s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[2], 27);
    b[1] = ROTL64(s[15], 36);
    b[2] = ROTL64(s[8], 10);
    b[3] = ROTL64(s[21], 15);
    b[4] = ROTL64(s[14], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[2] = b[0] ^ (b[2] &  t12);
        s[15] =  t12 ^ (b[2] | b[3]);
        s[8] = b[2] ^ (b[4] &  t34);
        s[21] =  t34 ^ (b[4] | b[0]);
        s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[1], 62);
    b[1] = ROTL64(s[19], 55);
    b[2] = ROTL64(s[7], 39);
    b[3] = ROTL64(s[20], 41);
    b[4] = ROTL64(s[13], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[1] = b[0] ^ (b[2] &  t12);
        s[19] =  t12 ^ (b[2] | b[3]);
        s[7] = b[2] ^ (b[4] &  t34);
        s[20] =  t34 ^ (b[4] | b[0]);
        s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x800aUL;

    /* Round 19. */
    /* Col Mix */
    b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
    b[1] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
    b[2] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
    b[3] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
    b[4] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[17], 44);
    b[2] = ROTL64(s[9], 43);
    b[3] = ROTL64(s[21], 21);
    b[4] = ROTL64(s[13], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[17] =  t12 ^ (b[2] | b[3]);
        s[9] = b[2] ^ (b[4] &  t34);
        s[21] =  t34 ^ (b[4] | b[0]);
        s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[24], 28);
    b[1] = ROTL64(s[11], 20);
    b[2] = ROTL64(s[3], 3);
    b[3] = ROTL64(s[15], 45);
    b[4] = ROTL64(s[7], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[24] = b[0] ^ (b[2] &  t12);
        s[11] =  t12 ^ (b[2] | b[3]);
        s[3] = b[2] ^ (b[4] &  t34);
        s[15] =  t34 ^ (b[4] | b[0]);
        s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[18], 1);
    b[1] = ROTL64(s[5], 6);
    b[2] = ROTL64(s[22], 25);
    b[3] = ROTL64(s[14], 8);
    b[4] = ROTL64(s[1], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[18] = b[0] ^ (b[2] &  t12);
        s[5] =  t12 ^ (b[2] | b[3]);
        s[22] = b[2] ^ (b[4] &  t34);
        s[14] =  t34 ^ (b[4] | b[0]);
        s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[12], 27);
    b[1] = ROTL64(s[4], 36);
    b[2] = ROTL64(s[16], 10);
    b[3] = ROTL64(s[8], 15);
    b[4] = ROTL64(s[20], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[12] = b[0] ^ (b[2] &  t12);
        s[4] =  t12 ^ (b[2] | b[3]);
        s[16] = b[2] ^ (b[4] &  t34);
        s[8] =  t34 ^ (b[4] | b[0]);
        s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[6], 62);
    b[1] = ROTL64(s[23], 55);
    b[2] = ROTL64(s[10], 39);
    b[3] = ROTL64(s[2], 41);
    b[4] = ROTL64(s[19], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[6] = b[0] ^ (b[2] &  t12);
        s[23] =  t12 ^ (b[2] | b[3]);
        s[10] = b[2] ^ (b[4] &  t34);
        s[2] =  t34 ^ (b[4] | b[0]);
        s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x800000008000000aUL;

    /* Round 20. */
    /* Col Mix */
    b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
    b[1] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
    b[2] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
    b[3] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
    b[4] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[11], 44);
    b[2] = ROTL64(s[22], 43);
    b[3] = ROTL64(s[8], 21);
    b[4] = ROTL64(s[19], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[11] =  t12 ^ (b[2] | b[3]);
        s[22] = b[2] ^ (b[4] &  t34);
        s[8] =  t34 ^ (b[4] | b[0]);
        s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[21], 28);
    b[1] = ROTL64(s[7], 20);
    b[2] = ROTL64(s[18], 3);
    b[3] = ROTL64(s[4], 45);
    b[4] = ROTL64(s[10], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[21] = b[0] ^ (b[2] &  t12);
        s[7] =  t12 ^ (b[2] | b[3]);
        s[18] = b[2] ^ (b[4] &  t34);
        s[4] =  t34 ^ (b[4] | b[0]);
        s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[17], 1);
    b[1] = ROTL64(s[3], 6);
    b[2] = ROTL64(s[14], 25);
    b[3] = ROTL64(s[20], 8);
    b[4] = ROTL64(s[6], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[17] = b[0] ^ (b[2] &  t12);
        s[3] =  t12 ^ (b[2] | b[3]);
        s[14] = b[2] ^ (b[4] &  t34);
        s[20] =  t34 ^ (b[4] | b[0]);
        s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[13], 27);
    b[1] = ROTL64(s[24], 36);
    b[2] = ROTL64(s[5], 10);
    b[3] = ROTL64(s[16], 15);
    b[4] = ROTL64(s[2], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[13] = b[0] ^ (b[2] &  t12);
        s[24] =  t12 ^ (b[2] | b[3]);
        s[5] = b[2] ^ (b[4] &  t34);
        s[16] =  t34 ^ (b[4] | b[0]);
        s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[9], 62);
    b[1] = ROTL64(s[15], 55);
    b[2] = ROTL64(s[1], 39);
    b[3] = ROTL64(s[12], 41);
    b[4] = ROTL64(s[23], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[9] = b[0] ^ (b[2] &  t12);
        s[15] =  t12 ^ (b[2] | b[3]);
        s[1] = b[2] ^ (b[4] &  t34);
        s[12] =  t34 ^ (b[4] | b[0]);
        s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000080008081UL;

    /* Round 21. */
    /* Col Mix */
    b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
    b[1] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
    b[2] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
    b[3] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
    b[4] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[7], 44);
    b[2] = ROTL64(s[14], 43);
    b[3] = ROTL64(s[16], 21);
    b[4] = ROTL64(s[23], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[7] =  t12 ^ (b[2] | b[3]);
        s[14] = b[2] ^ (b[4] &  t34);
        s[16] =  t34 ^ (b[4] | b[0]);
        s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[8], 28);
    b[1] = ROTL64(s[10], 20);
    b[2] = ROTL64(s[17], 3);
    b[3] = ROTL64(s[24], 45);
    b[4] = ROTL64(s[1], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[8] = b[0] ^ (b[2] &  t12);
        s[10] =  t12 ^ (b[2] | b[3]);
        s[17] = b[2] ^ (b[4] &  t34);
        s[24] =  t34 ^ (b[4] | b[0]);
        s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[11], 1);
    b[1] = ROTL64(s[18], 6);
    b[2] = ROTL64(s[20], 25);
    b[3] = ROTL64(s[2], 8);
    b[4] = ROTL64(s[9], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[11] = b[0] ^ (b[2] &  t12);
        s[18] =  t12 ^ (b[2] | b[3]);
        s[20] = b[2] ^ (b[4] &  t34);
        s[2] =  t34 ^ (b[4] | b[0]);
        s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[19], 27);
    b[1] = ROTL64(s[21], 36);
    b[2] = ROTL64(s[3], 10);
    b[3] = ROTL64(s[5], 15);
    b[4] = ROTL64(s[12], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[19] = b[0] ^ (b[2] &  t12);
        s[21] =  t12 ^ (b[2] | b[3]);
        s[3] = b[2] ^ (b[4] &  t34);
        s[5] =  t34 ^ (b[4] | b[0]);
        s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[22], 62);
    b[1] = ROTL64(s[4], 55);
    b[2] = ROTL64(s[6], 39);
    b[3] = ROTL64(s[13], 41);
    b[4] = ROTL64(s[15], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[22] = b[0] ^ (b[2] &  t12);
        s[4] =  t12 ^ (b[2] | b[3]);
        s[6] = b[2] ^ (b[4] &  t34);
        s[13] =  t34 ^ (b[4] | b[0]);
        s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000000008080UL;

    /* Round 22. */
    /* Col Mix */
    b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
    b[1] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
    b[2] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
    b[3] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
    b[4] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[10], 44);
    b[2] = ROTL64(s[20], 43);
    b[3] = ROTL64(s[5], 21);
    b[4] = ROTL64(s[15], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[10] =  t12 ^ (b[2] | b[3]);
        s[20] = b[2] ^ (b[4] &  t34);
        s[5] =  t34 ^ (b[4] | b[0]);
        s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[16], 28);
    b[1] = ROTL64(s[1], 20);
    b[2] = ROTL64(s[11], 3);
    b[3] = ROTL64(s[21], 45);
    b[4] = ROTL64(s[6], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[16] = b[0] ^ (b[2] &  t12);
        s[1] =  t12 ^ (b[2] | b[3]);
        s[11] = b[2] ^ (b[4] &  t34);
        s[21] =  t34 ^ (b[4] | b[0]);
        s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[7], 1);
    b[1] = ROTL64(s[17], 6);
    b[2] = ROTL64(s[2], 25);
    b[3] = ROTL64(s[12], 8);
    b[4] = ROTL64(s[22], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[7] = b[0] ^ (b[2] &  t12);
        s[17] =  t12 ^ (b[2] | b[3]);
        s[2] = b[2] ^ (b[4] &  t34);
        s[12] =  t34 ^ (b[4] | b[0]);
        s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[23], 27);
    b[1] = ROTL64(s[8], 36);
    b[2] = ROTL64(s[18], 10);
    b[3] = ROTL64(s[3], 15);
    b[4] = ROTL64(s[13], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[23] = b[0] ^ (b[2] &  t12);
        s[8] =  t12 ^ (b[2] | b[3]);
        s[18] = b[2] ^ (b[4] &  t34);
        s[3] =  t34 ^ (b[4] | b[0]);
        s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[14], 62);
    b[1] = ROTL64(s[24], 55);
    b[2] = ROTL64(s[9], 39);
    b[3] = ROTL64(s[19], 41);
    b[4] = ROTL64(s[4], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[14] = b[0] ^ (b[2] &  t12);
        s[24] =  t12 ^ (b[2] | b[3]);
        s[9] = b[2] ^ (b[4] &  t34);
        s[19] =  t34 ^ (b[4] | b[0]);
        s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x80000001UL;

    /* Round 23. */
    /* Col Mix */
    b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
    b[1] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
    b[2] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
    b[3] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
    b[4] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
    t = b[4] ^ ROTL64(b[1], 1);
    s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
    t = b[0] ^ ROTL64(b[2], 1);
    s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
    t = b[1] ^ ROTL64(b[3], 1);
    s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
    t = b[2] ^ ROTL64(b[4], 1);
    s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
    t = b[3] ^ ROTL64(b[0], 1);
    s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
    /* Row Mix */
    b[0] = s[0];
    b[1] = ROTL64(s[1], 44);
    b[2] = ROTL64(s[2], 43);
    b[3] = ROTL64(s[3], 21);
    b[4] = ROTL64(s[4], 14);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[0] = b[0] ^ (b[2] &  t12);
        s[1] =  t12 ^ (b[2] | b[3]);
        s[2] = b[2] ^ (b[4] &  t34);
        s[3] =  t34 ^ (b[4] | b[0]);
        s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[5], 28);
    b[1] = ROTL64(s[6], 20);
    b[2] = ROTL64(s[7], 3);
    b[3] = ROTL64(s[8], 45);
    b[4] = ROTL64(s[9], 61);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[5] = b[0] ^ (b[2] &  t12);
        s[6] =  t12 ^ (b[2] | b[3]);
        s[7] = b[2] ^ (b[4] &  t34);
        s[8] =  t34 ^ (b[4] | b[0]);
        s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[10], 1);
    b[1] = ROTL64(s[11], 6);
    b[2] = ROTL64(s[12], 25);
    b[3] = ROTL64(s[13], 8);
    b[4] = ROTL64(s[14], 18);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[10] = b[0] ^ (b[2] &  t12);
        s[11] =  t12 ^ (b[2] | b[3]);
        s[12] = b[2] ^ (b[4] &  t34);
        s[13] =  t34 ^ (b[4] | b[0]);
        s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[15], 27);
    b[1] = ROTL64(s[16], 36);
    b[2] = ROTL64(s[17], 10);
    b[3] = ROTL64(s[18], 15);
    b[4] = ROTL64(s[19], 56);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[15] = b[0] ^ (b[2] &  t12);
        s[16] =  t12 ^ (b[2] | b[3]);
        s[17] = b[2] ^ (b[4] &  t34);
        s[18] =  t34 ^ (b[4] | b[0]);
        s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    b[0] = ROTL64(s[20], 62);
    b[1] = ROTL64(s[21], 55);
    b[2] = ROTL64(s[22], 39);
    b[3] = ROTL64(s[23], 41);
    b[4] = ROTL64(s[24], 2);
    {
        word64 t12, t34;

        t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
        s[20] = b[0] ^ (b[2] &  t12);
        s[21] =  t12 ^ (b[2] | b[3]);
        s[22] = b[2] ^ (b[4] &  t34);
        s[23] =  t34 ^ (b[4] | b[0]);
        s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
    }
    /* XOR in constant. */
    s[0] ^= 0x8000000080008008UL;
}

